package com.walkud.rxjava.utils;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.observables.GroupedObservable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 分组观察者(订阅者)
 * 处理分组Map获取
 * (问题：Map中不能使用泛型，待优化)，两种解决方案
 * 1、获取map后，使用类型强转再使用
 * 2、对每个分组需求，创建指定类型的观察者
 *
 * @param <>
 */
public abstract class RxGroupBySubscriber implements Observer<GroupedObservable> {

    private Map<Object, List<Object>> map = new HashMap<>();

    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(GroupedObservable groupedObservable) {
        groupedObservable.subscribe(new Consumer<Object>() {
            //
            @Override
            public void accept(Object obj) {

                Object key = groupedObservable.getKey();
                List<Object> values = map.get(key);
                if (values == null) {
                    values = new ArrayList<>();
                    map.put(key, values);
                }
                values.add(obj);
            }
        });
    }


    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onComplete() {
        call(map);
    }

    public abstract void call(Map<Object, List<Object>> map);
}
